<script >
	// #ifdef H5
	import 'jweixin-module';
	// #endif
	import request from './utils/request.js'
	import config from './utils/config.js'
	import store from './store/index.js'
	import wxAuth from './utils/wxAuth.js'
	export default {
		onLaunch: function(options) {
			// #ifdef APP
			// 版本更新
			this.updateVersion()
			// #endif
			const asyncLogin = () => {
				store.dispatch('getUserInfo')
				if(this.globalData.requestList.length > 0) {
					// 如果有需要登录的接口在未登录之前执行了，则需要执行以下代码
					this.globalData.requestList.forEach(item => {
						item.request(item.data,item.gptp).then(res => {
							item.resolve(res)
						}).catch(err => {
							item.reject(err)
						})
					})
					this.globalData.requestList = [];
				}else {
					// 正常流程
					
				}
			}
			
			const loginFun = (res,extra_params) => {
				if(store.state.token) {
					this.globalData.hasLogin = true;
					asyncLogin()
					return;
				}
				request({
					url:'mobile/user/login_by_code',
					data: {
						code: res.code,
						appid: config.appid,
						// #ifdef H5
						usersource: 1,// 1.H5前端 2.微信小程序 3.快手小程序, 4抖音小程序
						// #endif
						extra_params,
						model: systemInfo.model
					},
					needLogin: false,
				}).then(res => {
					this.globalData.hasLogin = true;
					store.commit('setToken',res.token)
					asyncLogin(res)
				}).catch(err => {
					if(err.code === 40163 || err.code === 40029) {
						wxAuth()
					}
				})
			}
			// #ifdef H5
			if(import.meta.env.MODE === 'development') {
				store.commit('setToken','b2ZjREx0MHZGUVR2eWo2N1Q1QzM3UzdhUHk4Ue%2B8jDUzNjIwMDkzODE5NzU5MzPvvIxvZmNETHQwdkbvvIwxOTUzNA%3D%3D')
				this.globalData.hasLogin = true;
				asyncLogin()
				return
			}
			// #endif
			// #ifdef APP
			if(!store.state.token) {
				uni.redirectTo({
					url: '/pages/login/login'
				})
			}else {
				this.globalData.hasLogin = true;
				asyncLogin()
			}
			// #endif
			// 公众号登录
			// #ifdef H5
			if(options.query.token) {
				this.globalData.hasLogin = true;
				store.commit('setToken',options.query.token)
				// store.commit('setToken','c2lsZW50LTg5NzU377yMMzQxOTAyODM5NjQ2NTM3Ne%2B8jHNp77yMMTk1MTE%3D')
				asyncLogin()
			}else if(store.getters.token) {
				this.globalData.hasLogin = true;
				asyncLogin()
			}else {
				wxAuth()
			}
			return
			// h5获取链接中参数的方法
			const getQuery = () => {
				const search = window.location.search;
				if(!!!search) return null;
				const str = search.replace('?','');
				const keyValues = str.split('&');
				let obj = {};
				keyValues.forEach(item => {
					const keyAndValue = item.split('=');
					obj[keyAndValue[0]] = keyAndValue[1]
				})
				return obj
			}
				// 获取链接中的参数
				if(store.state.token) {
					this.globalData.hasLogin = true;
					asyncLogin()
				}else {
					if(!getQuery() || !getQuery().code) {
						wxAuth()
						// window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${config.appid}&redirect_uri=${encodeURIComponent(window.location.href)}&response_type=code&scope=snsapi_base&state=null#wechat_redirect`
					}else {
						let extra_params = JSON.stringify({...getQuery(),state:undefined,code:undefined});
						extra_params = (extra_params === '{}' || extra_params === 'undefined' || !extra_params) ? '' : extra_params
						extra_params && store.commit('setExtra',extra_params)
						// return;
						loginFun({
							code: getQuery().code
						},extra_params)
					}
				}
			// #endif
		
		},
		onShow: function(options) {
			console.log('App Show',options)
		},
		onHide: function() {
			console.log('App Hide')
		},
		methods: {
			/**
			 * @description 授权页面  */
			wxConfig:(jsApiList = []) => {
				return new Promise((resolve,reject) => {
					request({
						url:'mobile/user/jsapi_ticket',
						data: {
							url: window.location.href
						}
					}).then(res => {
						wx.config({
							debug: false, // 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来，若要查看传入的参数，可以在 pc 端打开，参数信息会通过 log 打出，仅在 pc 端时才会打印。
							appId: config.appid, // 必填，公众号的唯一标识
							// timestamp: '', // 必填，生成签名的时间戳
							// nonceStr: '', // 必填，生成签名的随机串
							// signature: '', // 必填，签名
							...res,
							jsApiList // 必填，需要使用的 JS 接口列表
						});
					})
					wx.ready(function() {
						// config信息验证后会执行 ready 方法，所有接口调用都必须在 config 接口获得结果之后，config是一个客户端的异步操作，所以如果需要在页面加载时就调用相关接口，则须把相关接口放在 ready 函数中调用来确保正确执行。对于用户触发时才调用的接口，则可以直接调用，不需要放在 ready 函数中。
						resolve(wx)
					})
				})
			},
			updateVersion() {
				const device = uni.getDeviceInfo()
				if(device.platform !== 'android') return;
				// #ifdef APP-PLUS  
				plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {  
					console.log(widgetInfo,'widgetInfo app 版本信息等')
				    request({  
				        url: '/api/v1/miletus/app/version', 
						data: {
							appType: 'android'
						},
						method: 'get',
						needLogin: false,
				    }).then(res => {
						console.log(res,'resss')
						if (res.lastVersion > Number(widgetInfo.versionCode)) {  
							uni.showModal({
								title:'版本更新',
								content: '有新的版本需要更新，是否下载新版本？',
								confirmText: '取消',
								cancelText: "确定",
								success: r => {
									if(r.cancel) {
										store.state.showUpdate = true
										const downloadDistance = uni.downloadFile({
										    url: res.downloadUrl,  
										    success: (downloadResult) => {  
										        if (downloadResult.statusCode === 200) {  
										            plus.runtime.install(downloadResult.tempFilePath, {  
										                force: true  
										            }, function() {  
										                console.log('install success...');  
										                plus.runtime.restart();  
										            }, function(e) {  
										                console.error('install fail...');  
										            });  
										        }  
										    },
											fail: err => {
												console.log(err,'fial')
											},
											complete: c => {
												console.log(c,'complete')
											}
										}); 
										downloadDistance.onProgressUpdate((res) => {
											// 监听下载进度
											store.state.percentage = res.progress
											if(res.progress == 100) {
												store.state.showUpdate = false
											}
										})
									}
								}
							})
						} 
					}).catch(err => {
						console.log(err,'errr')
					})
				});  
				// #endif
			}
		},
		globalData:{
			hasLogin: false,
			requestList:[],//登录流程未执行完毕之前执行的需要登录的接口
			// 统一处理消息订阅
			subscribe:(tmplIds = config.tmplIds) => {
				return new Promise((resolve,reject) => {
					uni.requestSubscribeMessage({
						tmplIds,
						success(res) {
							const acceptIds = tmplIds.filter(item => res[item] === 'accept');
							if(acceptIds.length > 0) {
								uni.showToast({
									icon:'none',
									title:'订阅成功！'
								})
								request({
									url:'mobile/user/user_subscribe',
									data:{
										tmpl_id: acceptIds.join(',')
									}
								}).then(res => {
								})
								resolve()
							}else {
								uni.showToast({
									icon:'none',
									title:'订阅失败！'
								})
								reject()
							}
						},
						fail(err) {
							console.log(err,'err')
							uni.showToast({
								icon:'none',
								title:'订阅失败！'
							})
							reject()
						}
					})
				})
			},
			/**
			 *  @param {_this} 调用该方法的页面实例 
			 *  @param {type} 广告类型  rewarded_ad 激励视频 interstitial_ad 插屏广告 unit_ad	前贴广告 cover_ad 封面广告  custom_ad 原生模板广告
			 *  只有激励视频和插屏广告需要创建实例
			 * */
			playAd:(_this,type) => {
				// #ifdef MP-WEIXIN
				const keyMap = { rewarded_ad:'createRewardedVideoAd', interstitial_ad: 'createInterstitialAd'}
				const userInfo = store.state.userInfo;
				return new Promise((resolve,reject) => {
					if(wx[keyMap[type]]) {
						const video = wx[keyMap[type]]({adUnitId: userInfo[`${type}_code`]})
						resolve(video)
					}
				})
				// #endif
			},
			/**
			 * @description 授权页面  */
			wxConfig:(jsApiList = []) => {
				return new Promise((resolve,reject) => {
					request({
						url:'mobile/user/jsapi_ticket',
						data: {
							url: window.location.href
						}
					}).then(res => {
						wx.config({
							debug: false, // 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来，若要查看传入的参数，可以在 pc 端打开，参数信息会通过 log 打出，仅在 pc 端时才会打印。
							appId: config.appid, // 必填，公众号的唯一标识
							// timestamp: '', // 必填，生成签名的时间戳
							// nonceStr: '', // 必填，生成签名的随机串
							// signature: '', // 必填，签名
							...res,
							jsApiList // 必填，需要使用的 JS 接口列表
						});
					})
					wx.ready(function() {
						// config信息验证后会执行 ready 方法，所有接口调用都必须在 config 接口获得结果之后，config是一个客户端的异步操作，所以如果需要在页面加载时就调用相关接口，则须把相关接口放在 ready 函数中调用来确保正确执行。对于用户触发时才调用的接口，则可以直接调用，不需要放在 ready 函数中。
						resolve(wx)
					})
				})
			}
		}
	}
</script>

<style lang="scss">
	/*每个页面公共css */
	/* uVIew的样式文件 */
	@import "uview-plus/index.scss";
	page {
		// background-color: $my-bg;
		background-image: url('static/bg.png');
		background-size: cover;
		color: #fff;
	}
</style>
